package com.atguigu.recursion;

/**
 * @author 龍
 * 迷宫回溯问题
 */
public class MiGong {
    public static void main(String[] args) {
        //先创建一个二维数组，模拟迷宫:8行7列
        int[][] map=new int[8][7];
        //设置围墙的四周：使用1表示墙，0表示非墙
        for (int i = 0; i < 7; i++) {
            map[0][i]=1;
            map[7][i]=1;
        }
        for (int i = 1; i < 8; i++) {
            map[i][0]=1;
            map[i][6]=1;
        }
        //设置挡板，1表示墙
        map[3][1]=1;
        map[3][2]=1;
        //遍历地图情况-->有助于我们查看
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 7; j++) {
                System.out.print(map[i][j]+"\t");
            }
            System.out.println();
        }
        System.out.println("使用递归回溯给小球找路，2代表小球路径！！！");
        setWay(map,1,1);
        //输出新的地图，小球走过，并表示过的地图
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 7; j++) {
                System.out.print(map[i][j]+"\t");
            }
            System.out.println();
        }


    }
    /**
     * 使用递归回溯来给小球找路
     * @param map :表示地图
     * @param i :开始走的横坐标
     * @param j：开始走的纵坐标
     * @return  如果找到通路，就返回true，否则返回false
     * 说明：
     * 1 从【1，1】出发，到【6，5】则表示成功.
     * 2 当map【i】【j】为0则表示没有走过，当为1的时候表示为墙，2表示通路走，3表示该点已经走过，但是走不通。
     * 3 再走迷宫的时候需要定一个策略：下-->右--上-->左
     * 注意：策略决定了行走的路线。如果想要求解最短路径，可以通过更改行走的测略来求出路线，然后从中的到最短的路径
     */
    public static boolean setWay(int[][] map,int i,int j){
        if(map[6][5]==2){
            //说明通路已经ok
            return true;
        }else{
            //该点还没走过
            if (map[i][j]==0){
                //假设该点是可以走得通的
                map[i][j]=2;
                if (setWay(map,i+1,j)){
                    return true;
                }else if(setWay(map,i,j+1)){
                    return true;
                }else if (setWay(map,i-1,j)){
                    return true;
                }else if (setWay(map,i,j-1)){
                    return true;
                } else {
                    //说明该点是走不通的，是一条死路。
                    map[i][j]=3;
                    return false;
                }
            }else{
                //如果map【i】【j】！=0，则可能使1，2，3
                return false;
            }
        }
    }
}
